home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Src / lconsole / show.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  3.6 KB  |  172 lines

  1. /* show.c: filter matching functions */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Src/lconsole/RCS/show.c,v 6.0 1991/12/18 20:27:16 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Src/lconsole/RCS/show.c,v 6.0 1991/12/18 20:27:16 jpo Rel $
  9.  *
  10.  * $Log: show.c,v $
  11.  * Revision 6.0  1991/12/18  20:27:16  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16. #include "lconsole.h"
  17. #include "qmgr.h"
  18. #include "qmgr-int.h"
  19. #include <isode/cmd_srch.h>
  20. #ifdef  BSD42
  21. #include <sys/ioctl.h>
  22. #endif
  23.  
  24. #define plural(n,s)    ((n) == 1 ? "" : (s))
  25.  
  26. extern char *msgtolist;
  27. extern int msglist_update();
  28.  
  29. static CMD_TABLE tb_filters[] = {
  30. #define F_CONTENT    1
  31.     QFILTER_CONTENT,    F_CONTENT,
  32. #define F_EIT        2
  33.     QFILTER_EIT,        F_EIT,
  34. #define F_PRIO        3
  35.     QFILTER_PRIO,        F_PRIO,
  36. #define F_RECENT    4
  37.     QFILTER_MORERECENT,    F_RECENT,
  38. #define F_EARLIER    5
  39.     QFILTER_EARLIER,    F_EARLIER,
  40. #define F_MAXSIZE    6
  41.     QFILTER_MAXSIZE,    F_MAXSIZE,
  42. #define F_ORIG        7
  43.     QFILTER_ORIG,        F_ORIG,
  44. #define    F_RECIP        8
  45.     QFILTER_RECIP,        F_RECIP,
  46. #define F_CHANNEL    9
  47.     QFILTER_CHANNEL,    F_CHANNEL,
  48. #define F_MTA        10
  49.     QFILTER_MTA,        F_MTA,
  50. #define F_QUEID        11
  51.     QFILTER_QUEUEID,    F_QUEID,
  52. #define F_MPDU        12
  53.     QFILTER_MPDU,        F_MPDU,
  54. #define F_UA        13
  55.     QFILTER_UA,        F_UA,
  56.     NULLCP,            NOTOK
  57.     };
  58.  
  59. static int rebuild_list (vec)
  60. char **vec;
  61. {
  62.     CMD_TABLE *cmd, *ep;
  63.     char *cp;
  64.     int i, n, width, w;
  65.     int cols, lines;
  66.     char buf[BUFSIZ];
  67.  
  68.     for(i = 0; vec[i]; i++) {
  69.         if ((cp = index(vec[i], '=')) == NULLCP) {
  70.             advise (NULLCP, "Missing '=' in %s", vec[i]);
  71.             return NOTOK;
  72.         }
  73.  
  74.         *cp ++ = '\0';
  75.         switch (n = tb_match(vec[i], tb_filters)) {
  76.             case TB_AMBIG:
  77.             n = strlen (vec[i]);
  78.             cp = buf;
  79.             for (cmd = tb_filters; cmd -> cmd_key; cmd ++) {
  80.                 if (lexnequ (vec[i], cmd -> cmd_key, n) == 0) {
  81.                     (void) sprintf (cp, "%s%s",
  82.                             cp == buf ? "" : ", ",
  83.                             cmd -> cmd_key);
  84.                     cp += strlen(cp);
  85.                 }
  86.             }    
  87.             advise (NULLCP, "%s is ambiguous, it matches %s",
  88.                 vec[i], buf);
  89.             return NOTOK;
  90.  
  91.             case TB_NONE:
  92.             advise (NULLCP, "%s doesn't match any known key, use one of:",
  93.                 vec[i]);
  94.             for (width = 0, ep = tb_filters; ep -> cmd_key; ep++)
  95.                 if ((n = strlen (ep -> cmd_key)) > width)
  96.                     width = n;
  97.             if ((cols = ncols(stdout) /
  98.                  (width = (width + 8) & ~7)) == 0)
  99.                 cols = 1;
  100.             lines = ((ep - tb_filters) + cols - 1) / cols;
  101.             
  102.             for (n = 0; n < lines; n++)
  103.                 for (i = 0; i < cols; i++) {
  104.                     cmd = tb_filters + i * lines + n;
  105.                     printf ("%s", cmd -> cmd_key);
  106.                     if (cmd + lines >= ep) {
  107.                         printf ("\n");
  108.                         break;
  109.                     }
  110.                     for (w = strlen(cmd -> cmd_key);
  111.                          w < width; w = (w + 8) & ~7)
  112.                         (void) putchar ('\t');
  113.                 }
  114.             return NOTOK;
  115.  
  116.             default:
  117.             (void) sprintf (buf, "%s=%s",
  118.                     rcmd_srch (n, tb_filters),
  119.                     cp);
  120.             vec[i] = strdup(buf);
  121.             break;
  122.         }
  123.     }
  124.     return OK;
  125. }
  126.  
  127. /* ARGSUSED */
  128. static int showmsglist(msgl, id)
  129. MsgList *msgl;
  130. int id;
  131. {
  132.     MsgInfo *mip;
  133.  
  134.     indent = 0;
  135.     if (msgl == NULL || msgl -> msgs == NULL)
  136.         advise (NULLCP, "No messages found");
  137.     else
  138.         for (mip = msgl -> msgs; mip; mip = mip -> next)
  139.             display_msg_info (mip);
  140.     free_MsgList (msgl);
  141.     return OK;
  142. }
  143.  
  144. int f_show (vec)
  145. char **vec;
  146. {
  147.     char errbuf[BUFSIZ];
  148.     char buffer[BUFSIZ];
  149.     int pid;
  150.  
  151.     if (*++vec == NULLCP) {
  152.         if (getline ("expression: ", buffer) == NOTOK ||
  153.             str2vec (buffer, vec) < 1)
  154.             return OK;
  155.     }
  156.     if (rebuild_list(vec) == NOTOK)
  157.         return OK;
  158.     msgtolist = ".";
  159.     if (initiate_op (console_fd, operation_Qmgr_readmsginfo,
  160.                vec, &pid, showmsglist, errbuf) == NOTOK) {
  161.         advise (NULLCP, "filter operation failed: %s", errbuf);
  162.         return NOTOK;
  163.     }
  164.     while (*vec)
  165.         free (*vec++);
  166.     if (result_op (console_fd, &pid, errbuf) == NOTOK) {
  167.         advise (NULLCP, "result_op: %s", errbuf);
  168.         return NOTOK;
  169.     }
  170.     return OK;
  171. }
  172.